/*
 * @Author: error: error: git config user.name & please set dead value or install git && error: git config user.email & please set dead value or install git & please set dead value or install git
 * @Date: 2025-03-21 14:33:44
 * @LastEditors: error: error: git config user.name & please set dead value or install git && error: git config user.email & please set dead value or install git & please set dead value or install git
 * @LastEditTime: 2025-03-21 21:09:33
 * @FilePath: /lesson/Thread_ring_queue/Main.cc
 * @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
 */
#include"Ring_queue.hpp"
#include"Task.hpp"
#include<iostream>
#include<pthread.h>
#include<ctime>
#include<unistd.h>

using namespace std;


void* Consumer(void* args)
{
    RingQueue<Task>* rq=static_cast<RingQueue<Task>*>(args);
    while(true)
    {

        //sleep(1);
        Task t;
        int data=0;
        // 1、消费数据
        rq->Pop(&t);

        // 2、处理数据
        t();
        cout<<" Consumer -> "<< t.result() <<endl;
    }
}

void* Productor(void* args)
{
    RingQueue<Task>* rq=static_cast<RingQueue<Task>*>(args);
    while(true)
    {
        sleep(1);
        // 1、构造数据
        int x=rand()%10+1;// 范围：[1,10]
        usleep(1000);
        int y=rand()%10+1;

        Task t(x,y);
        // 2、生产数据
        rq->Push(t);

        cout<<" Productor -> "<< t.debug() <<endl;
    }
}


int main()
{

    srand(time(nullptr)^ getpid());

    RingQueue<Task>* rq=new RingQueue<Task>(5);

    // 单单
    // 创建两个线程：c,p

    // 多生产 多消费
    pthread_t c1,c2,p1,p2,p3;

    pthread_create(&c1,nullptr,Consumer,rq);
    pthread_create(&c2,nullptr,Consumer,rq);
    pthread_create(&p1,nullptr,Productor,rq);
    pthread_create(&p2,nullptr,Productor,rq);
    pthread_create(&p3,nullptr,Productor,rq);

    pthread_join(c1,nullptr);
    pthread_join(c2,nullptr);
    pthread_join(p1,nullptr);
    pthread_join(p2,nullptr);
    pthread_join(p3,nullptr);

    return 0;
}